From 49335f22337808675b6bf3184e6124b0a88813de Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Sun, 21 Sep 2014 17:22:26 -0700 Subject: [PATCH] Hook up `cargo update` to pkgids --- src/cargo/core/resolver.rs | 39 +++++++++++++++++------- src/cargo/ops/cargo_generate_lockfile.rs | 12 ++++---- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/cargo/core/resolver.rs b/src/cargo/core/resolver.rs index 3e5f6b90c..6815fcc78 100644 --- a/src/cargo/core/resolver.rs +++ b/src/cargo/core/resolver.rs @@ -2,19 +2,12 @@ use std::collections::HashMap; use std::fmt; use serialize::{Encodable, Encoder, Decodable, Decoder}; -use util::profile; -use util::graph::{Nodes, Edges}; - -use core::{ - Dependency, - PackageId, - Registry, - SourceId, -}; - use semver; -use util::{CargoResult, Graph, human, internal}; +use core::{Dependency, PackageId, Registry, SourceId, PackageIdSpec}; +use util::graph::{Nodes, Edges}; +use util::profile; +use util::{CargoResult, Graph, human, internal, ChainError}; #[deriving(PartialEq, Eq)] pub struct Resolve { @@ -208,6 +201,30 @@ impl Resolve { pub fn deps(&self, pkg: &PackageId) -> Option> { self.graph.edges(pkg) } + + pub fn query(&self, spec: &str) -> CargoResult<&PackageId> { + let spec = try!(PackageIdSpec::parse(spec).chain_error(|| { + human(format!("invalid package id specification: `{}`", spec)) + })); + let mut ids = self.iter().filter(|p| spec.matches(*p)); + let ret = match ids.next() { + Some(id) => id, + None => return Err(human(format!("package id specification `{}` \ + matched no packages", spec))), + }; + match ids.next() { + Some(other) => { + let mut msg = format!("Ambiguous package id specification: \ + `{}`\nMatching packages:\n {}\n {}", + spec, ret, other); + for id in ids { + msg = format!("{}\n {}", msg, id); + } + Err(human(msg)) + } + None => Ok(ret) + } + } } impl fmt::Show for Resolve { diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 7e6327d56..0c214a99b 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -54,12 +54,12 @@ pub fn update_lockfile(manifest_path: &Path, let sources = match to_update { Some(name) => { let mut to_avoid = HashSet::new(); - for dep in resolve.iter().filter(|d| d.get_name() == name.as_slice()) { - if aggressive { - fill_with_deps(&resolve, dep, &mut to_avoid); - } else { - to_avoid.insert(dep); - } + let dep = try!(resolve.query(name.as_slice())); + fill_with_deps(&resolve, dep, &mut to_avoid); + if aggressive { + fill_with_deps(&resolve, dep, &mut to_avoid); + } else { + to_avoid.insert(dep); } resolve.iter().filter(|pkgid| !to_avoid.contains(pkgid)) .map(|pkgid| pkgid.get_source_id().clone()).collect() -- 2.30.2